ALL, DISTINCT, DISTINCTROW, TOP - predykaty

Okre£laj╣ rekordy wybrane z kwerend SQL.

Sk│adnia

SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
    FROM tabela

Sk│adnia instrukcji SELECT z tymi predykatami zawiera nastΩpuj╣ce elementy:

Element Opis
ALL Przyjmowane jest, ┐e nie stosuje siΩ ┐adnych predykat≤w. Aparat bazy danych Microsoft Jet wybiera wszystkie rekordy spe│niaj╣ce warunki instrukcji SQL. Obie podane ni┐ej instrukcje s╣ r≤wnowa┐ne: zwracaj╣ wszystkie rekordy tabeli Pracownicy:

SELECT ALL *
FROM Pracownicy
ORDER BY NrPracownika;

SELECT *
FROM Pracownicy
ORDER BY NrPracownika;

DISTINCT Pomijane s╣ te rekordy, kt≤re zawieraj╣ powtarzaj╣ce siΩ warto£ci we wszystkich wybieranych polach. Aby pojawiµ siΩ w wyniku kwerendy, warto£ci ka┐dego z p≤l wymienionych w instrukcji SELECT musz╣ byµ niepowtarzalne. Na przyk│ad wielu pracownik≤w wymienionych w tabeli Pracownicy mo┐e mieµ to samo nazwisko. Je£li dwa rekordy zawieraj╣ w polu Nazwisko warto£µ Kowalski, w≤wczas zwr≤cony bΩdzie tylko jeden z nich:

SELECT DISTINCT
Nazwisko
FROM Pracownicy;

Je£li predykat DISTINCT nie wyst╣pi, kwerenda zwr≤ci wszystkie rekordy z nazwiskiem Kowalski.

Je£li klauzula SELECT obejmuje kilka p≤l, w≤wczas jedynie nie powtarzaj╣ce siΩ kombinacje warto£ci wszystkich tych p≤l zostan╣ uwzglΩdnione w wyniku.

Wyniku kwerendy opartej na DISTINCT nie mo┐na aktualizowaµ i nie odzwierciedla on nastΩpuj╣cych zmian dokonanych przez innych u┐ytkownik≤w.

DISTINCTROW Pomija powtarzaj╣ce siΩ dane na podstawie warto£ci ca│ych rekord≤w, a nie jedynie wybranych p≤l. Za│≤┐my na przyk│ad, ┐e tworzymy kwerendΩ, kt≤ra sprzΩga tabele Klienci i Zam≤wienia wed│ug warto£ci pola KodKlienta. Tabela Klienci nie zawiera powtarzaj╣cych siΩ warto£ci w polu KodKlienta, w przeciwie±stwie do tabeli Zam≤wienia, gdzie mo┐e znajdowaµ siΩ wiele zam≤wie± od jednego klienta. Poni┐sza instrukcja SQL wykorzystuje predykat DISTINCTROW do uzyskania wykazu tych firm, kt≤re z│o┐y│y choµ jedno zam≤wienie, ale bez ujawniania szczeg≤│≤w tych zam≤wie±:

SELECT DISTINCTROW NazwaFirmy
FROM Klienci INNER JOIN Zam≤wienia
ON Klienci.KodKlienta = Zam≤wienia.KodKlienta
ORDER BY NazwaFirmy;

Bez predykatu DISTINCTROW ta kwerenda da w wyniku powtarzaj╣ce siΩ rekordy dla tych firm, kt≤re z│o┐y│y wiele zam≤wie±.

Predykat DISTINCTROW dzia│a tylko w takich kwerendach, kt≤re wybieraj╣ dane z niekt≤rych (nie wszystkich) tabel wykorzystanych w tej kwerendzie. Predykat DISTINCTROW jest ignorowany, je£li kwerenda dotyczy tylko jednej tabeli lub je£li wybierane s╣ pola ze wszystkich tabel.

TOP n [PERCENT] Zwraca tylko te rekordy, kt≤re mieszcz╣ siΩ (od g≤ry lub od do│u) w podanym zakresie rekord≤w uporz╣dkowanych klauzul╣ ORDER BY. Za│≤┐my, ┐e interesuj╣ nas dane o 25 najlepszych studentach, kt≤rzy uko±czyli studia w 1994 roku:

SELECT TOP 25
ImiΩ, Nazwisko
FROM Studenci
WHERE RokUko±czenia = 1994
ORDER BY îredniaOcenKo±cowych DESC;

Bez klauzuli ORDER BY ta kwerenda zwr≤ci zestaw 25 przypadkowych rekord≤w z tabeli Studenci spe│niaj╣cych warunek podany w klauzuli WHERE.

Predykat TOP nie wybiera pomiΩdzy r≤wnymi warto£ciami. Je£li na przyk│ad student dwudziesty pi╣ty i dwudziesty sz≤sty na li£cie maj╣ tΩ sam╣ £redni╣, kwerenda zwr≤ci 26 rekord≤w.

S│owo zastrze┐one PERCENT wskazuje, ┐e zwr≤cona ma byµ okre£lona czΩ£µ rekord≤w (od g≤ry lub od do│u) z listy utworzonej klauzul╣ ORDER BY, a nie ich konkretna liczba. Za│≤┐my, ┐e interesuj╣ nas dane nie o 25 najlepszych studentach, ale o grupie 10 procent najs│abszych student≤w:

SELECT TOP 10 PERCENT
ImiΩ, Nazwisko
FROM Studenci
WHERE RokUko±czenia = 1994
ORDER BY îredniaOcenKo±cowych ASC;

DziΩki u┐yciu s│owa zastrze┐onego ASC wybierane s╣ rekordy z do│u, a nie z g≤ry zakresu. Warto£µ podana po s│owie TOP musi byµ liczb╣ typu Integer bez znaku.

TOP nie ma wp│ywu na to, czy kwerenda mo┐e byµ aktualizowana czy nie.

tabela Nazwa tabeli, z kt≤rej pobierane s╣ rekordy.

Zobacz te┐
FROM û klauzula (Microsoft Jet SQL) SELECT û instrukcja (Microsoft Jet SQL)

Przyk│ad

ALL, DISTINCT, DISTINCTROW, TOP û przyk│ad predykatu